#include "../source/server.hpp"

void HandleClose(Channel *channel)
{
    std::cout << "close: " << channel->Fd() << std::endl;
    channel->Remove(); // 移除监控
    delete channel;    // 这里直接进行delete是不合理的，因为接下来其他地方可能还要使用这个channel
}
void HandleRead(Channel *channel)
{
    int fd = channel->Fd();
    char buf[1024] = {0};
    int ret = recv(fd, buf, 1023, 0); // 0 :代表阻塞式
    if (ret <= 0)                     // 如果对端关闭，或者读取出错
    {
        return HandleClose(channel); // 关闭释放
    }
    std::cout << buf << std::endl;
    channel->EnableWrite(); // 启动可写事件监控
}
void HandleWrite(Channel *channel)
{
    int fd = channel->Fd();
    const char *data = "天气真不错！！";
    int ret = send(fd, data, strlen(data), 0);
    if (ret < 0)
    {
        return HandleClose(channel); // 关闭释放
    }
    channel->DisableWrite(); // 关闭写监控
}
void HandleError(Channel *channel)
{
    return HandleClose(channel); // 关闭释放
}
void HandleEvent(Channel *channel)
{
    std::cout << "有了一个事件！！" << std::endl;
}

void Accepter(Poller *poller, Channel *lst_channel)
{
    int fd = lst_channel->Fd();
    int newfd = accept(fd, NULL, NULL);
    if (newfd < 0)
        return;
    Channel *channel = new Channel(poller, newfd);
    // 对新连接的channel进行设置，设置的是事件到来了该如何处理

    channel->SetReadCallback(std::bind(HandleRead, channel));  // 可读事件的回调函数
    channel->SetWriteCallback(std::bind(HandleWrite, channel)); // 可写事件的回调函数
    channel->SetCloseCallback(std::bind(HandleClose, channel)); // 关闭事件的回调函数
    channel->SetErrorCallback(std::bind(HandleError, channel)); // 错误事件的回调函数
    channel->SetEventCallback(std::bind(HandleEvent, channel)); // 任意事件的回调函数
    channel->EnableRead();       // 启动可读事件监听
}

int main()
{
    Poller poller;
    Socket lst_sock;
    lst_sock.CreateServer(8085);
    // 为监听套接字，创建一个Channel进行事件的管理，以及事件的处理
    Channel lst_channel(&poller, lst_sock.Fd());
    lst_channel.SetReadCallback(std::bind(Accepter, &poller, &lst_channel));
    lst_channel.EnableRead(); // 启动可读事件监听
    while (1)
    {
        std::vector<Channel *> actives;
        poller.Poll(&actives);
        for (auto &a : actives)
        {
            a->HandleEvent();
        }
    }
    lst_sock.Close();
    return 0;
}

// int main()
// {
//     Socket lst_sock;
//     lst_sock.CreateServer(8085);
//     while (1)
//     {
//         int newfd = lst_sock.Accept();
//         if(newfd < 0)
//         {
//             continue;
//         }
//         DLOG("ACCPEPT NEW SOCKET SUCCESS!");
//         Socket cli_sock(newfd);
//         char buffer[1024] = {0};
//         int n = cli_sock.Recv(buffer, 1023);
//         if(n < 0)
//         {
//             ELOG("RECV FAILED!");
//             cli_sock.Close();
//         }
//         ILOG("%s", buffer);
//         std::string  msg = "你好!";
//         cli_sock.Send(msg.c_str(), msg.size());
//         cli_sock.Close();
//     }
//     lst_sock.Close();
//     return 0;
// }